package com.demo.utils;
 
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;


public class DateUtil extends PropertyEditorSupport {
 
	/**
	 * 返回两个时间段之间的所有日期 
	 * @param beginDate
	 * @param endDate
	 * @return
	 * @throws ParseException
	 * @throws java.text.ParseException
	 */
	public static List<String> getDatesBetweenTwoDate(String beginDate,
			String endDate) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		List<String> lDate = new ArrayList<String>();
		lDate.add(beginDate);// 把开始时间加入集合
		Calendar cal = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		cal.setTime(sdf.parse(beginDate));
		boolean bContinue = true;
		while (bContinue) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			cal.add(Calendar.DAY_OF_MONTH, 1);
			// 测试此日期是否在指定日期之后
			if (sdf.parse(endDate).after(cal.getTime())) {
				lDate.add(sdf.format(cal.getTime()));
			} else {
				break;
			}
		}
		lDate.add(endDate);// 把结束时间加入集合
		return lDate;
	}
 
	/**
	 * 获得两个时间段之内的所有日期小时：例如传参数："2018-12-06 01"和"2018-12-06 23", 返回结果：[2018-12-06
	 * 01, 2018-12-06 02, 2018-12-06 03, 2018-12-06 04, ......, 2018-12-06 23]
	 * @param beginDate
	 * @param endDate
	 * @return
	 * @throws ParseException
	 * @throws java.text.ParseException
	 */
	public static List<String> getHoursBetweenTwoDate(String beginDate,
			String endDate) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH");
		List<String> lDate = new ArrayList<String>();
		lDate.add(beginDate);// 把开始时间加入集合
		Calendar cal = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		cal.setTime(sdf.parse(beginDate));
		boolean bContinue = true;
		while (bContinue) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			cal.add(Calendar.HOUR, 1);
			// 测试此日期是否在指定日期之后
			if (sdf.parse(endDate).after(cal.getTime())) {
				lDate.add(sdf.format(cal.getTime()));
			} else {
				break;
			}
		}
		lDate.add(endDate);// 把结束时间加入集合
		return lDate;
	}
 
	/**
	 * 获得两个时间段内所有的分钟，例如：传参“2018-11-20 00:00”和“2018-11-22 23:59”,
	 * 将会返回["2018-11-20 00:01","2018-11-20 00:02","2018-11-20 00:03"......,"2018-11-22 23:58","2018-11-22 23:59"] 
	 * @param beginDate
	 * @param endDate
	 * @return
	 * @throws ParseException
	 */
	public static List<String> getMinuteBetweenTwoDate(String beginDate,
			String endDate) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		List<String> lDate = new ArrayList<String>();
		lDate.add(beginDate + ":" + getSecond(60));// 把开始时间加入集合
		Calendar cal = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		cal.setTime(sdf.parse(beginDate));
		boolean bContinue = true;
		while (bContinue) {
			// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
			cal.add(Calendar.MINUTE, 1);
			// 测试此日期是否在指定日期之后
			if (sdf.parse(endDate).after(cal.getTime())) {
				lDate.add(sdf.format(cal.getTime()) + ":" + getSecond(60));
			} else {
				break;
			}
		}
		// 把结束时间加入集合
		lDate.add(endDate + ":" + getSecond(60));
		List<String> newList = lDate.stream().map(s -> s.substring(11, 16))
				.collect(Collectors.toList());
		return newList;
	}

	/**
	 * 获取一小时内的所有分钟
	 * [09:57, 09:58, 09:59, ..., 10:55, 10:56]
	 * @return
	 */
	public static List<String> getMinutesWithinAnHour() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
		List<String> dateList = new ArrayList<>();

		Date endDate = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(endDate);
		cal.add(Calendar.MINUTE, -59);
		Date startDate = cal.getTime();

		// 把开始时间加入集合
		dateList.add(sdf.format(startDate));
		while (true) {
			cal.add(Calendar.MINUTE, 1);
			if (endDate.after(cal.getTime())) {
				dateList.add(sdf.format(cal.getTime()));
			} else {
				break;
			}
		}
		// 把结束时间加入集合
		dateList.add(sdf.format(endDate));
		return dateList;
	}

	/**
	 * 获取24小时内的所有小时
	 * [12, 13, 14, 15, 16, ..., 10, 11]
	 * @return
	 */
	public static List<String> getHoursWithin24Hours() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH");
		List<String> dateList = new ArrayList<>();

		Date endDate = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(endDate);
		cal.add(Calendar.HOUR, -23);
		Date startDate = cal.getTime();

		// 把开始时间加入集合
		dateList.add(sdf.format(startDate));
		while (true) {
			cal.add(Calendar.HOUR, 1);
			if (endDate.after(cal.getTime())) {
				dateList.add(sdf.format(cal.getTime()));
			} else {
				break;
			}
		}
		// 把结束时间加入集合
		dateList.add(sdf.format(endDate));
		return dateList;
	}
 
	/**
	 * 获得某天所有的分钟
	 * 
	 * @param day
	 * @return
	 * @throws ParseException
	 * @throws java.text.ParseException
	 */
	public static List<String> getMinutes(String day) throws ParseException,
			java.text.ParseException {
		List<String> minuteList = getMinuteBetweenTwoDate(day + " 00:00", day
				+ " 23:59");
		return minuteList;
	}
 
	/**
	 * 获得i以内的随机整数 
	 * @param i
	 * @return
	 */
	public static String getSecond(int i) {
		long l = Math.round(Math.random() * i);
		if (l < 10) {
			return "0" + l;
		} else {
			if (l != i) {
				return "" + l;
			} else {
				return l - 1 + "";
			}
		}
	}
 
	/**
	 * 获得i以内的随机数，保留两位小数
	 * @param i
	 * @return
	 */
	public static String getRandom(int i) {
		double d = Math.random() * i;
		return String.format("%.2f", d);
	}
 
	public static void main(String[] args) {

		//			System.out.println(getDatesBetweenTwoDate("2018-12-01",
//					"2018-12-06"));
//			System.out.println(getHoursBetweenTwoDate("2018-12-06 01",
//					"2018-12-06 23"));
		System.out.println("--------------分钟------------");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//			sdf.
//		System.out.println(getMinutesWithinAnHour());
		System.out.println(getHoursWithin24Hours());
//			System.out.println(getMinutes("2018-12-06"));

	}
}